# 数据离散化
from __future__ import print_function
import pandas as pd
from sklearn.cluster import KMeans

datafile='data.xls'
processedfile='tmp/data_processed.xls'
typelabel={u'肝气郁结证型系数':'A',
           u'热毒蕴结证型系数':'B',
           u'冲任失调证型系数':'C',
           u'气血两虚证型系数':'D',
           u'脾胃虚弱证型系数':'E',
           u'肝肾阴虚证型系数':'F'}
k=4     #需要进行的聚类类别数
# 读取数据进行聚类分析
data=pd.read_excel(datafile)
keys=list(typelabel.keys())
result=pd.DataFrame()

if __name__=='__main__':
    for key,item in typelabel.items():
        print(u'正在进行"%s"的聚类..' % key)
        # 调用k-means算法，进行聚类离散化
        kmodel=KMeans(n_clusters=k,n_jobs=4)  #n_jobs是并行数，等于cpu数
        kmodel.fit(data[[key]].values)        #训练模型
        # 聚类中心
        r1=pd.DataFrame(kmodel.cluster_centers_,columns=[typelabel[key]])
        # 分类统计
        r2=pd.Series(kmodel.labels_).value_counts()
        # 转为DataFrame,记录各个类别的数目
        r2=pd.DataFrame(r2,columns=[item+'n'])
        # 匹配聚类中心和类别数目 合并为一个DataFrame
        r=pd.concat([r1,r2],axis=1).sort_values(item)
        r.index=list(range(1,5))
        # rolling_mean（）：用来计算相邻2列的均值，以此作为临界点
        r[item]=pd.Series.rolling(r[item],2).mean()
        r.loc[1,item]=0.0   #将NaN值转为0.0，数据类型是float64,不能用fillna
        result=result.append(r.T)
    # 以index排序，以A B C D E F 排序
    result =result.sort_index()
    print(result.head(5))
    result.to_excel(processedfile)